perm filename MIXDD[MIX,SYS] blob
sn#020813 filedate 1972-02-29 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 ROUTINES TO DISPLAY MIX STATUS ON DATA DISK DISPLAYS
00003 00003 GET SYMBOLIC NEXT INSTRUCTION
00008 00004 NOW WRITE ALL INFO TO THE DATA DISK BUFFER
00013 00005 TABLES USED BY DDUPD
00015 00006 ROUTINE TO REFRESH WHOLE SCREEN
00016 ENDMK
⊗;
COMMENT ⊗ ROUTINES TO DISPLAY MIX STATUS ON DATA DISK DISPLAYS
For each screen entry, there is a shadow entry kept of the
contents of the screen. When DDUPD is called, only those things which
have changed are rewritten.
⊗
BEGIN DDDPY
T←← 0
A←← 1
B←← 2
C←← 3
D←← 4
E←← 5
F←← 6
NEWMSK←← 16
↑DDUPD: ;UPDATE DD DISPLAY
MOVEM 16,SVREG+16 ;SAVE REGISTERS
MOVEI 16,SVREG
BLT 16,SVREG+15
COMMENT ⊗ GET SYMBOLIC NEXT INSTRUCTION ⊗
MOVEI T,1 ;INITIALIZE
MOVEM T,NXINS ; AREA FOR SYMBOLIC NEXT INSTRUCTION
MOVE A,[XWD NXINS,NXINS+1]
BLT A,NXINS+11
MOVE T,[POINT 7,NXINS]
; DO THE LABEL
HRRZ 10,SVREG+16 ;GET PC
SUBI 10,MC0000 ;MAKE THAT RELATIVE
PUSHJ P,SYMGET ;GET LABEL FOR INSTR
JUMPE 3,NXS1 ;NO SYMBOL
SKIPN 3(3) ;SEE IF VALUE OF SYMBOL IS 0
JRST NXS1 ;DO LIKE RAID, DON'T PRINT IT
CAIG 4,77 ;DON'T PUT OUT AN OFFSET OF GREATER THAN 77
JRST .+3
MOVE 4,10 ;PUT VALUE OF LOC IN REG 4
JRST NXS1 ;PUT THAT VALUE IS DISPLAY
PUSHJ P,SYMOUT ;PUT SYMBOL IN BUFFER
JUMPE 4,NXS2 ;NO OFFSET
MOVEI A,"+"
IDPB A,T ;DEPOSIT A +
NXS1: PUSHJ P,NUMOUT
NXS2: MOVEI A," "
IDPB A,T ;DEPOSIT 2 BLANKS
IDPB A,T
; DO THE OP CODE
MOVE 7,10 ;GET REL LOC OF INSTR
PUSHJ P,DECIDF ;DECIDE ABOUT F FIELD
MOVE B,@STROP(10) ;GET OP CODE MNEMONIC
MOVEM B,MNEM#
MOVE B,[POINT 7,MNEM]
ILDB A,B
JUMPE A,NXS3 ;COPY UNTIL 0
IDPB A,T
JRST .-3
NXS3: MOVEI A," " ;NOW 2 MORE BLANKS
IDPB A,T
IDPB A,T
; DO THE ADDRESS PART
HLRZ 10,MC0000(7) ;PICK UP ADDR OF INSTR
SKIPL MC0000(7) ;IS IT NEGATIVE
JRST NXS5 ;NO
ANDI 10,7777
TLO 10,400000 ;TURN ON SIGN BIT
PUSHJ P,GETNSM ;LOOK UP IN SYMTAB
JUMPN 4,NXS4 ;EXACT MATCH
MOVEI A,"-" ;WE'LL NEED THIS IN ANY OTHER CASE
IDPB A,T
JUMPN 3,NXS4 ;THERE WAS A ABS VAL MATCH
HRRZ 4,10 ;PUT ABS VAL IN OFFSET SLOT
JRST NXS6 ;GO DO IT
NXS4: PUSHJ P,SYMOUT ;PUT OUT SYMBOLIC
JRST NXS7
NXS5: PUSHJ P,SYMGET ;LOOK UP SYMBOL AND OFFSET
JUMPE 3,NXS6 ;NO SYMBOL
SKIPN 3(3) ;SEE IF VALUE OF SYMBOL IS 0
JRST NXS6 ;DO LIKE RAID, DON'T PRINT IT
CAIG 4,77 ;DON'T PUT OUT AN OFFSET OF GREATER THAN 77
JRST .+3
MOVE 4,10 ;PUT VALUE OF LOC IN REG 4
JRST NXS6 ;PUT THAT VALUE IS DISPLAY
PUSHJ P,SYMOUT ;WRITE SYMBOL
JUMPE 4,NXS7 ;NO OFFSET
MOVEI A,"+"
IDPB A,T ;PUT OUT A +
NXS6: PUSHJ P,NUMOUT ;PUT OUT OFFSET
; DO INDEX FIELD
NXS7: LDB 4,[POINT 6,MC0000(7),23] ;PICK UP INDEX
JUMPE 4,NXS8 ;NO INDEX
MOVEI A,","
IDPB A,T ;PUT OUT A ,
PUSHJ P,NUMOUT ;PUT OUT INDEX VALUE
; DO F FIELD IF NOT THE DEFAULT FOR THE OP CODE
NXS8: JUMPN 6,UPD1 ;GO UPDATE
MOVEI A,"("
IDPB A,T
LDB 4,[POINT 6,MC0000(7),29] ;GET FIELD SPEC
PUSHJ P,NUMOUT ;WRITE IT OUT
MOVEI A,")"
IDPB A,T
JRST UPD1 ;NOW GO WRITE SCREEN
COMMENT ⊗ WRITE OUT THE LABEL WHICH IS A SIXBIT STRING OF UP TO 12 CHARACTERS
IN LOCATIONS 1(3)-2(3). DEPOSIT ASCII CHARACTERS BY POINTER T
⊗
SYMOUT: MOVE A,1(3) ;GET FIRST 6 CHARS
MOVEM A,SYMB
MOVE A,2(3)
MOVEM A,SYMB+1
MOVE B,[POINT 6,SYMB]
ILDB A,B ;GET A CHAR
JUMPE A,.+4 ;QUIT AT 0
ADDI A,40 ;CONVERT TO ASCII
IDPB A,T ;STORE IN OUTPUT BUFFER
JRST .-4
POPJ P,
SYMB: BLOCK 2
0
COMMENT ⊗ WRITE OUT THE NUMBER IN REG 4 IN DECIMAL ⊗
NUMOUT: IDIVI 4,=10 ;DIVIDE BY TEN
HRLM 5,(P) ;SAVE ON STACK
SKIPE 4 ;IS THAT ALL
PUSHJ P,NUMOUT ;NO
HLRZ 4,(P) ;GET DIGIT OFF STACK
ADDI 4,60 ;CONVERT TO ASCII
IDPB 4,T ;STORE IT
POPJ P, ;NEXT DIGIT OR RETURN
COMMENT ⊗ NOW WRITE ALL INFO TO THE DATA DISK BUFFER ⊗
UPD1: MOVNI A,NDPY ;GET # OF ENTRIES
SKIPA NEWMSK,[0] ;ZERO OUT MASK FOR CHANGED ENTRIES
LKDPY: LSH NEWMSK,1 ;GET PLACE FOR BIT FOR NEXT ENTRY
MOVE B,SIZE+NDPY(A) ;GET (SIZE OF ENTRY)-1
HLRZ C,LOC+NDPY(A) ;GET LOC OF NEW ENTRY
HRRZ D,LOC+NDPY(A) ;GET LOC OF SHADOW ENTRY
HRLI C,B
HRLI D,B
; Now compare entry with shadow entry
CMPR: MOVE T,@C ;PICK UP WORD OF NEW
CAME T,@D ;COMPARE TO SHADOW
JRST NEW1 ;NOT THE SAME
SOJGE B,CMPR ;LOOK AT NEXT WORD
AOJLE A,LKDPY ;NO CHANGE IN ENTRY, LOOK AT NEXT ENTRY
JRST WRIT1 ;THAT'S ALL, GO WRITE EVEN LINES
NEW1: IORI NEWMSK,1 ;TURN ON BIT IN MASK
AOJLE A,LKDPY ;LOOK AT NEXT ENTRY
; At this point, NEWMSK has a bit on for each entry that has changed
; from what it is on the screen. Write even lines of these entries
WRIT1:
JUMPE NEWMSK,WRIT4 ;QUIT IT THERE'S NOTHING TO DO
MOVEM NEWMSK,MSKSAV# ;SAVE MASK
MOVEI A,NDPY ;GET # OF ENTRIES
MOVEI E,DDBUF+1 ;POINT TO DD BUFFER
SKIPA
WRIT1A: LSH NEWMSK,-1 ;GET BIT FOR NEXT ENTRY
JUMPE NEWMSK,WRIT2 ;QUIT IF NO MORE HAVE CHANGED
TRNN NEWMSK,1 ;IS BIT ON FOR THIS ENTRY?
SOJA A,WRIT1A ;NO
MOVE T,DDCODE(A) ;GET DD INSTR
MOVEM T,(E) ;STORE IN BUFFER
MOVEI B,1(E) ;GET LOC OF AVAIL BUFFER
MOVE C,B ;SAVE LOC
HLL B,LOC(A) ;GET LOC OF NEW ENTRY
ADD C,SIZE(A) ;POINT TO LAST LOC OF BLT
BLT B,(C) ;MOVE NEW ENTRY TO BUFFER
ADD E,SIZE(A)
MOVE T,CRLF ;TACK CR-LF ON END OF ENTRY
MOVEM T,2(E)
ADDI E,3 ;MOVE E PAST NEW CODE
SOJGE A,WRIT1A ;NOW DO NEXT ENTRY
; Now write odd lines and move entries to shadows
WRIT2:
MOVE NEWMSK,MSKSAV ;GET MASK
MOVEI A,NDPY ;GET # OF ENTRIES
SKIPA
WRIT2A: LSH NEWMSK,-1 ;GET BIT FOR NEXT ENTRY
JUMPE NEWMSK,WRIT3 ;QUIT IF NO MORE HAVE CHANGED
TRNN NEWMSK,1 ;IS BIT ON FOR THIS ENTRY?
SOJA A,WRIT2A ;NO
MOVE T,DDCODE(A) ;GET DD INSTR
IORI T,10000 ;SPECIFY ODD LINE
MOVEM T,(E) ;STORE IN BUFFER
MOVEI B,1(E) ;GET LOC OF AVAIL BUFFER
MOVE C,B ;SAVE LOC
HLL B,LOC(A) ;GET LOC OF NEW ENTRY
ADD C,SIZE(A) ;POINT TO LAST LOC OF BLT
BLT B,(C) ;MOVE NEW ENTRY TO BUFFER
ADD E,SIZE(A)
MOVE T,CRLF ;TACK CR-LF ON END OF ENTRY
MOVEM T,2(E)
ADDI E,3 ;MOVE E PAST NEW CODE
MOVE B,LOC(A) ;NOW MOVE TO SHADOW
MOVEI C,(B)
ADD C,SIZE(A)
BLT B,(C)
SOJGE A,WRIT2A ;NOW DO NEXT ENTRY
; We are now ready to write the buffer
WRIT3:
SETZM T,(E) ;PUT A 0 AT THE END OF THE BUFFER
SUBI E,DDBUF-1 ;CALCULATE SIZE OF BUFFER
MOVEM E,DDOPG+1
UPGIOT 1,DDOPG ;WRITE SCREEN
; The display is updated, restore registers and return
WRIT4: MOVSI 16,SVREG
BLT 16,16
POPJ P,
SVREG: BLOCK 17 ;REGISTERS SAVED HERE
DDOPG: DDBUF
0
CRLF: ASCID /
/
COMMENT ⊗ TABLES USED BY DDUPD ⊗
DD1(4)
ASCID /NEXT INS: / ;BUFFER FOR SYMBOLIC NEXT INSTRUCTION
NXINS: BLOCK 12
DD2(4)
NDPY←←21-1
SIZE: ;CONTAINS (SIZE OF ENTRY)-1
FOR @& A←NDPY+1,1,-1
{DDSZ&A -1
}
MAXBUF←←0 ;COUNTER TO DETERMINE BUFFER SIZE NEEDED
MAXSHA←←0 ;POINTER INTO SHADOW TABLE
LOC: ;CONTAINS XWD <LOC OF ENTRY>,<LOC OF SHADOW>
FOR @& A←NDPY+1,1,-1
{ XWD DDLB&A,SHADOW+MAXSHA
MAXSHA←←MAXSHA+DDSZ&A
MAXBUF←←MAXBUF+DDSZ&A+2
}
A←←344
DDCODE: ;CONTAINS DATA DISK INSTRUCTION FOR ENTRY
REPEAT NDPY+1, {BYTE (8) 2,A⊗-4,A∧17 (3) 3,4,5,4
A←←A-14}
SHADOW: BLOCK MAXSHA+1
DDBUF: BYTE (8) 46,2,2 (3) 1,3,3,4
BLOCK 2*MAXBUF+2
COMMENT ⊗ ROUTINE TO REFRESH WHOLE SCREEN ⊗
↑REWRIT: ;REWRITE WHOLE SCREEN
MOVEM 0,SVREG ;SAVE REGISTER 0
SETZM SHADOW ;ZERO OUT SHADOW REGISTERS
MOVE 0,[XWD SHADOW,SHADOW+1]
BLT 0,SHADOW+MAXSHA
MOVE 0,SVREG
JRST DDUPD ;UPDATE SCREEN
BEND DDDPY